NetworkX是一个用Python语言开发的图论与复杂网络建模工具,内置了常用的图与复杂网络分析算法,可以方便地进行复杂网络数据分析、仿真建模等工作。

NetworkX的安装与导入

我们可以通过在命令行提示符cmd(对于Windows系统)或者终端Terminal(对于Mac系统)使用下述命令安装NetworkX:

pip install networkx

如果已经是使用Anaconda作为编程集成环境,那电脑中已经装好该库了,无需再次安装。 一般我们在使用时会将其简写为nx

import networkx as nx

在绘图时我们往往也会结合Matplotlib库一起使用。 networkx 的一些常用函数举例如下:

生成无向赋权图

可以根据图中两点之间是否有联系以及权重是多少构建赋权邻接矩阵(NetworkX中没有直接联系的点权重由0表示):

$$ \left[\begin{matrix}0 & 9 & 2 & 4 & 7\\9 & 0 & 3 & 4 & 0\\2 & 3 & 0 & 8 & 4\\4 & 4 & 8 & 0 & 6\\7 & 0 & 4 & 6 & 0\end{matrix}\right] $$
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
%matplotlib inline
a = np.array([[0., 9., 2., 4., 7.],
       [9., 0., 3., 4., 0.],
       [2., 3., 0., 8., 4.],
       [4., 4., 8., 0., 6.],
       [7., 0., 4., 6., 0.]])
a1 = pd.DataFrame(a,index=range(1,6),columns=range(1,6))

接下来根据邻接矩阵构建无向图

G = nx.from_numpy_array(a1)
G.edges(data=True) # 显示权重

绘制图像

pos=nx.shell_layout(G)  #布局设置
nx.draw_networkx(G,pos,node_size=260)
w = nx.get_edge_attributes(G,'weight') # 获取权重
nx.draw_networkx_edge_labels(G,pos,font_size=12,edge_labels=w) #标注权重
plt.savefig('images/net0102.png')
plt.show()

图形的布局有五种设置:

求最短路径

NetworkX中含有多种求最短路径的方法,如迪杰斯特拉(Dijkstra)算法,弗洛伊德(Floyd)算法等,我们可以同nx.shortest_pathnx.shortest_path_length来分别求最短路径及最短路径长度。

nx.shortest_path(G,5,2,weight='weight')

结果为[5,3,2].

nx.shortest_path_length(G,5,2,weight='weight')

结果为7.

求最小生成树

构造连通图最小生成树的算法有克鲁斯卡(Kruskal)算法和普利姆(Prim)算法。

tree_min = nx.minimum_spanning_tree(G,weight='weight')
pos=nx.shell_layout(G)  #布局设置
nx.draw_networkx(tree_min,pos,node_size=260)
w = nx.get_edge_attributes(tree_min,'weight')
nx.draw_networkx_edge_labels(tree_min,pos,font_size=12,edge_labels=w) #标注权重
plt.savefig('images/net0103.png')
plt.show()